﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace PixelDetectSDKInterface
{
    public enum AdjustParam : int
    {
        //自动调整选项
        _FG_DSDK_AUTOAD_CROP = 0x00000001,      // 自动裁切
        _FG_DSDK_AUTOAD_CLBK = 0x00000002,      // 自动清理背景
        _FG_DSDK_AUTOAD_FACE = 0x00000004,      // 自动调整面部颜色
        _FG_DSDK_AUTOAD_HOTS = 0x00000008,      // 自动清理高光
        _FG_DSDK_AUTOAD_CLBKEX = 0x00000010,   // 增强清理背景
        _FG_DSDK_AUTOAD_FCRP = 0x00010000,      // 强制剪裁（否则不够裁时自动调整会直接返回错误_FGE_IMAGECROPSCALELACK）
    };

    public class DetectSDKInterface
    {
        /** 初始化动态库       */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXInitDetectSdk")]
        public static extern int InitDetectSdk();

        /** 创建图像检测句柄
        * @param[out] pHandle 返回可用的句柄
        * @param[in]  model_path 模型文件路径
        * @param[in]  device_id 如果存在可用加速设备，指定调用的设备id，-1默认CPU
        * @return < 0 创建失败, 其他成功
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXCreateImageDetectHandle")]
        public static extern int CreateImageDetectHandle(ref IntPtr pHandle, string modelPath, int device_id = -1);

        /** 销毁指定的图像检测句柄
        * @param[in] pHandle 图像检测句柄
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXDestroyImageDetectHandle")]
        public static extern int DestroyImageDetectHandle(IntPtr pHandle);

        /** 装载特征标准
        * @param[in] hDetect 图像检测句柄
        * @param[in] stream  特征流指向的首地址
        * @param[in] stream_size 特征流长度
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXLoadStd")]
        public static extern int LoadStd(IntPtr hDetect, [In, Out, MarshalAs(UnmanagedType.LPArray)]byte[] stream, int stream_size);

        /** 装载特征标准
        * @param[in] hDetect 图像检测句柄
        * @param[in] stream  特征流指向的首地址
        * @param[in] stream_size 特征流长度
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXLoadStd")]
        public static extern int LoadStd(IntPtr hDetect, IntPtr stream, int stream_size);

        /** 装载待检测图片
        * @param[in] hDetect 图像检测句柄
        * @param[in] stream  图片流指向的首地址
        * @param[in] stream_size 图片流长度
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXLoadImage")]
        public static extern int LoadImage(IntPtr hDetect, IntPtr stream, int stream_size);

        /** 装载待检测图片
       * @param[in] hDetect 图像检测句柄
       * @param[in] stream  图片流指向的首地址
       * @param[in] stream_size 图片流长度
       * @return = 0 成功，其他返回错误码
       */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXLoadImage")]
        public static extern int LoadImage(IntPtr hDetect, [In, Out, MarshalAs(UnmanagedType.LPArray)]byte[] stream, int stream_size);

        /** 对加载的图片进行质量检测
        * @param[in] hDetect 图像检测句柄
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXDetectImage")]
        public static extern int DetectImage(IntPtr hDetect);

        /** 获得图像检测的评价值
        * @param[in] hDetect 图像检测句柄
        * @param[out] pValue 检测结果
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXAssess")]
        public static extern int Assess(IntPtr hDetect, IntPtr pValue);

        /** 获取质量判定的文本结果
        * @param[in] hDetect 图像检测句柄
        * @param[int] text_length 接收字符串的长度
        * @param[out] res_text 接收字符串的首地址
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CharSet=CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "PXAssessString")]
        public static extern int AssessString(IntPtr hDetect, int text_length, IntPtr textPtr);

        /** 调整图像
        * @param[in] hDetect 图像检测句柄
        * @return = 0 成功，其他返回错误码
        * 结果通过PixelDetectGetAdjustImage获取
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXAdjustImage")]
        public static extern int AdjustImage(IntPtr hDetect, int flag);

        /** 获取调整后的图片大小
        * @param[in] hDetect 图像检测句柄
        * @param[out] size 指定图像格式编码后的大小
        * @param[in] type 需要编码的格式
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CharSet=CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "PXGetImageSize")]
        public static extern int GetImageSize(IntPtr hDetect, IntPtr size, string type = ".jpg");

        /** 获取调整后的图片
        * @param[in] hDetect 图像检测句柄
        * @param[out] data 内存图片指向的地址，需要分配PixelDetectGetImageSize大小的内存
        * @param[in] type 需要编码的格式
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "PXGetImage")]
        public static extern int GetImage(IntPtr hDetect, [In, Out, MarshalAs(UnmanagedType.LPArray)]byte[] data, string type = ".jpg");

        /** 人像位置检测
         * @param[in] hDetect 图像检测句柄
        * @param[out] face_location_attr 检测结果
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "PixelDetectFaceLocationAttribute")]
        public static extern int PixelDetectFaceLocationAttribute(IntPtr hDetect, /*_FGFaceLocationAttribute*/IntPtr face_location_attr);

        /** 脸部属性检测
        * @param[in] hDetect 图像检测句柄
        * @param[out] face_attr 检测结果
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "PixelDetectFaceAttribute")]
        public static extern int PixelDetectFaceAttribute(IntPtr hDetect, /*_FGFaceAttribute*/IntPtr face_attr);

        /** 获取检测标准库信息
        * @param[in] hDetect 图像检测句柄
        * @param[out] std_data 特征库信息
        * @return = 0 成功，其他返回错误码
        */
        [DllImport("PixelDetectSDK\\DetectSDK-S.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "PixelDetectGetStdData")]
        public static extern int PixelDetectGetStdData(IntPtr hDetect, /*_FGImageDetectStdData*/IntPtr std_data);


    }
}
